/*
 * menu.c
 *
 *  Created on: Jun 26, 2011
 *      Author: tualibano
 */

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>

#include "configurar.h"
#include "structs.h"
#include "Conectar.h"
#include "menu.h"
#include "busca.h"
#include "arquivo.h"

int menu() {

	char tecla;

	serveruptcp = ' ';
	serverupudp = ' ';
	clienteon = ' ';
	vizinhos = 0;

	while (1) {
		system("clear");
		printf(" *** SpiritBreaker ***\n");
		printf(" menu\n");
		printf("   t) abrir servidor tcp \n");
		printf("   u) abrir servidor udp \n");
		printf("   c) conectar-se \n");
		printf("   b) localizar arquivo \n");
		printf("   v) mostrar vizinhos atuais \n");
		printf("   f) fazer downloads \n");
		printf("   h) créditos - teste udp\n");
		printf("   i) escolher interface de rede\n");
		printf("   x) sair \n");
		printf("   tcp[%c] udp [%c] conectado [%c] vizinhos [%d]", serveruptcp,
				serverupudp, clienteon, vizinhos);

		tecla = getchar();
		switch (tecla) {
		case 't':
			system("clear");
			gerenciartcp();
			break;
		case 'u':
			system("clear");
			gerenciarudp();
			break;
		case 'c':
			system("clear");
			conectarse();
			break;
		case 'b':
			system("clear");
			buscar();
			// abre a busca
			break;
		case 'v':
			system("clear");
			mostrarvizinhos();
			break;
			system("clear");
		case 'f':
			fazerdownloads();
			// mostra transferencias.
			break;
		case 'h':
			teste();
			// mostra transferencias.
			break;
		case 'i':
			getiplocal(NULL);
			// mostra transferencias.
			break;
		case 'x':
			sair();
			// mostra transferencias.
			break;
		}
	}
	return 0;
}

int gerenciartcp() {
	if (serveruptcp == ' ') {
		IniciarServidorTcp();
		serveruptcp = 'X';
	}
	getchar();
	//system("clear");
	return 0;
}

int gerenciarudp() {

	if (serverupudp == ' ') {
		IniciarServidorUdp();
		serverupudp = 'X';
	}
	getchar();
	//system("clear");
	return 0;
}

int conectarse() {
	Vizinho servidor;
	puts("digite o ip do server?");
	scanf("%s", servidor.Ip);

	puts("digite a porta tcp do server?");
	scanf("%d", &servidor.PortaTcp);

	puts("digite a porta udp do server?");
	scanf("%d", &servidor.PortaUdp);

	ConectarTcp(&servidor, INICIAL);
	clienteon = 'X';
	getchar();
	//system("clear");
	return 0;
}

int buscar() {

	char busca[64];
	getchar();
	puts("\ndigite a busca:");
	scanf("%s", busca);
	buscarnarede(busca);
	//	system("clear");
	return 0;
}

int mostrarvizinhos() {
	PrintTabela(tabela_vizinhos);
	getchar();
	getchar();
	//system("clear");
	return 0;
}

int fazerdownloads() {
	int iarquivo;
	printtabelabusca(&tabelabusca);
	scanf("%i", &iarquivo);
	// extrair nome do arquivo a ser buscado
	// na tabela a partir do indice "iarquivo".
	baixa(iarquivo);
	//baixaressecara = buscartabelabusca(&tabelabusca, nomedoarquivo);
	//baixararquivo(tabelabusca);

	getchar();
	//system("clear");
	return 0;
}

int teste() {
	//testar udp aqui.

	struct sockaddr_in ipremoto;
	int socketremoto, porta;
	unsigned int iplen = sizeof(struct sockaddr_in);
	char buffer[512], ip[16];

	porta = 5001;
	strcpy(buffer, "");
	puts("\ndigite a mensagem: ");
	scanf("%s", buffer);
	puts("\ndigite o ip");
	scanf("%s", ip);
	puts("\ndigite a porta");
	scanf("%d", &porta);

	if ((socketremoto = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
		perror("socket");

	ipremoto.sin_family = AF_INET;
	ipremoto.sin_port = htons(porta);
	ipremoto.sin_addr.s_addr = inet_addr(ip);
	bzero(&(ipremoto.sin_zero), 8);

	sendto(socketremoto, buffer, 512, 0, (struct sockaddr*) &ipremoto, iplen);

	return 0;
}

int sair() {
	exit(0);
	return 0;
}

